﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Libreria.RFID.Modelo;

namespace Libreria.RFID.Negocio
{
    public class PersonaNegocio
    {
        public List<Persona> consultarPersonas(String CadenaDeConexion)
        {
            Persona personas = new Persona(CadenaDeConexion);
            return personas.consultar();
        }

        public Persona consultarPersonasPorCodigo(Int32 codigoPersona, String CadenaDeConexion)
        {
            Persona personas = new Persona(CadenaDeConexion);
            return personas.consultarPorCodigo(codigoPersona);
        }

        public Persona verificarPersonasPorNumeroDocumento(String numeroDeDocumento, String CadenaDeConexion, out String tipoAcceso)
        {
            List<Persona> lista = new List<Persona>();
            tipoAcceso = "";
            if (numeroDeDocumento != null)
            {
                Persona personas = new Persona(CadenaDeConexion);
                personas.Codigo = null;
                personas.TipoDeDocumento = null;
                personas.NumeroDeDocumento = numeroDeDocumento;
                personas.Nombre = null;
                personas.Apellido = null;
                personas.Genero = null;
                personas.FechaDeNacimiento = DateTime.MinValue;
                personas.Direccion = null;
                personas.Telefono = null;
                personas.CorreoElectronico = null;
                personas.Estado = null;

                lista = personas.consultar();

                if (lista.Count() != 0)
                {
                    RegistroDeAccesoNegocio rdan = new RegistroDeAccesoNegocio();
                    RegistroDeAcceso rdaTemp = rdan.consultarPorCodigoPersona(lista[0].Codigo.Value, CadenaDeConexion);

                    RegistroDeAcceso rda = new RegistroDeAcceso(CadenaDeConexion);
                    if ((rdaTemp.FechaSalida == DateTime.MinValue && rdaTemp.FechaEntrada == DateTime.MinValue) || rdaTemp.FechaSalida > DateTime.MinValue)
                    {
                        rda.FechaEntrada = DateTime.Now;
                        rda.IdentificadorAcceso = null;
                        rda.CodigoPersona = lista[0].Codigo;
                        rda.CodigoTAG = null;
                        rda.crear();
                        tipoAcceso = "Entrada exitosa";
                    }
                    else
                    {
                        if (rdaTemp.FechaEntrada > DateTime.MinValue && rdaTemp.FechaSalida == DateTime.MinValue)
                        {
                            rda.FechaSalida = DateTime.Now;
                            rda.IdentificadorAcceso = rdaTemp.IdentificadorAcceso;
                            rda.CodigoPersona = lista[0].Codigo;
                            rda.CodigoTAG = null;
                            rda.actualizar();
                            tipoAcceso = "Salida exitosa";
                        }                        
                    }

                }


            }
            return (lista.Count > 0 ) ? lista[0] : null;
        }

        public void crearPersona(Int32 Codigo, Int32 TipoDeDocumento,
            String NumeroDeDocumento, String Nombre, String Apellido, Int32 Genero,
            DateTime FechaDeNacimiento, String Direccion, String Telefono, String CorreoElectronico,
            Int32 Estado, String CadenaDeConexion, Int32 perfil, out String tipoAcceso)
        {
            List<Persona> lista = new List<Persona>();
            tipoAcceso = "";
            Persona personas = new Persona(CadenaDeConexion);
            personas.Codigo = null;
            personas.TipoDeDocumento = null;
            personas.NumeroDeDocumento = NumeroDeDocumento;
            personas.Nombre = null;
            personas.Apellido = null;
            personas.Genero = null;
            personas.FechaDeNacimiento = DateTime.MinValue;
            personas.Direccion = null;
            personas.Telefono = null;
            personas.CorreoElectronico = null;
            personas.Estado = null;

            lista = personas.consultar();

            if (lista.Count() == 0)
            {

                Persona personaACrear = new Persona(CadenaDeConexion);
                personaACrear.Codigo = null;
                personaACrear.TipoDeDocumento = TipoDeDocumento;
                personaACrear.NumeroDeDocumento = NumeroDeDocumento;
                personaACrear.Nombre = Nombre;
                personaACrear.Apellido = Apellido;
                personaACrear.Genero = Genero;
                personaACrear.FechaDeNacimiento = FechaDeNacimiento;
                personaACrear.Direccion = Direccion;
                personaACrear.Telefono = Telefono;
                personaACrear.CorreoElectronico = CorreoElectronico;
                personaACrear.Estado = Estado;
                personaACrear.crear();

                PerfilesDeUsuarioNegocio perfilAAsignar = new PerfilesDeUsuarioNegocio();
                perfilAAsignar.asociarPerfilAUsuario(perfil, personaACrear.Codigo.Value, CadenaDeConexion);
                tipoAcceso = "Elusuario fue creado exitosamente";
            }
            else
            {

                tipoAcceso = "El Numero de Documento ya tiene un usuario";

            }

        }

        public void crearPersona(Int32 Codigo, Int32 TipoDeDocumento, String NumeroDeDocumento, String Nombre, String Apellido, Int32 Genero,
            DateTime FechaDeNacimiento, String Direccion, String Telefono, String CorreoElectronico, Int32 Estado, String CadenaDeConexion, out String tipoAcceso)
        {
            List<Persona> lista = new List<Persona>();
            tipoAcceso = "";
            Persona personas = new Persona(CadenaDeConexion);
            personas.Codigo = null;
            personas.TipoDeDocumento = null;
            personas.NumeroDeDocumento = NumeroDeDocumento;
            personas.Nombre = null;
            personas.Apellido = null;
            personas.Genero = null;
            personas.FechaDeNacimiento = DateTime.MinValue;
            personas.Direccion = null;
            personas.Telefono = null;
            personas.CorreoElectronico = null;
            personas.Estado = null;

            lista = personas.consultar();

            if (lista.Count() == 0)
            {

                Persona personaACrear = new Persona(CadenaDeConexion);
                personaACrear.Codigo = null;
                personaACrear.TipoDeDocumento = TipoDeDocumento;
                personaACrear.NumeroDeDocumento = NumeroDeDocumento;
                personaACrear.Nombre = Nombre;
                personaACrear.Apellido = Apellido;
                personaACrear.Genero = Genero;
                personaACrear.FechaDeNacimiento = FechaDeNacimiento;
                personaACrear.Direccion = Direccion;
                personaACrear.Telefono = Telefono;
                personaACrear.CorreoElectronico = CorreoElectronico;
                personaACrear.Estado = Estado;
                personaACrear.crear();
                tipoAcceso = "el usuario fue creado exitosamente";

            }
            else
            {

                tipoAcceso = "El Numero de Documento ya tiene un usuario";

            }

        }

        public void actualizarPersona(Int32 Codigo, Int32 TipoDeDocumento, String NumeroDeDocumento, String Nombre, String Apellido, Int32 Genero,
            DateTime FechaDeNacimiento, String Direccion, String Telefono, String CorreoElectronico, Int32 Estado, String CadenaDeConexion)
        {
            Persona personaAActualizar = new Persona(CadenaDeConexion);
            personaAActualizar.Codigo = Codigo;
            personaAActualizar.TipoDeDocumento = TipoDeDocumento;
            personaAActualizar.NumeroDeDocumento = NumeroDeDocumento;
            personaAActualizar.Nombre = Nombre;
            personaAActualizar.Apellido = Apellido;
            personaAActualizar.Genero = Genero;
            personaAActualizar.FechaDeNacimiento = FechaDeNacimiento;
            personaAActualizar.Direccion = Direccion;
            personaAActualizar.Telefono = Telefono;
            personaAActualizar.CorreoElectronico = CorreoElectronico;
            personaAActualizar.Estado = Estado;
            personaAActualizar.actualizar();
        }

        public void eliminarPerfil(Int32 Codigo, String CadenaDeConexion, out String mensaje)
        {
            List<AprendizDeTitulado> lista = new List<AprendizDeTitulado>();
            List<RegistroDeAcceso> listareporte = new List<RegistroDeAcceso>();
            List<Usuario> listausuario = new List<Usuario>();

            mensaje = "";


            AprendizDeTitulado aprendices = new AprendizDeTitulado(CadenaDeConexion);
            aprendices.CodigoPersona = Codigo;
            aprendices.CodigoTitulado = null;

            RegistroDeAcceso reportes = new RegistroDeAcceso(CadenaDeConexion);
            reportes.IdentificadorAcceso = null;
            reportes.CodigoTAG = null;
            reportes.CodigoPersona = Codigo;
            reportes.FechaEntrada = DateTime.MinValue;
            reportes.FechaSalida = DateTime.MinValue;

            Usuario usuarios = new Usuario(CadenaDeConexion);
            usuarios.Codigo = Codigo;
            usuarios.Nombre = null;
            usuarios.Clave = null;

            listausuario = usuarios.consultar();
            listareporte = reportes.consultar();
            lista = aprendices.consultar();

            if (lista.Count() == 0 && listareporte.Count() == 0 && listausuario.Count()==0)
            {

                Persona personaAEliminar = new Persona(CadenaDeConexion);
                personaAEliminar.Codigo = Codigo;
                personaAEliminar.TipoDeDocumento = null;
                personaAEliminar.NumeroDeDocumento = null;
                personaAEliminar.Nombre = null;
                personaAEliminar.Apellido = null;
                personaAEliminar.Genero = null;
                personaAEliminar.FechaDeNacimiento = DateTime.MinValue;
                personaAEliminar.Direccion = null;
                personaAEliminar.Telefono = null;
                personaAEliminar.CorreoElectronico = null;
                personaAEliminar.Estado = null;
                personaAEliminar.eliminar();
            }
            else
            {
                mensaje = "No se puede eliminar la Persona, la esta utilizando otra tabla";

            }

        }
    }
}
